package org.ghost.spring.cloud.hystrix.demo.service.impl;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import org.ghost.spring.cloud.hystrix.demo.dao.IHelloDAO;
import org.ghost.spring.cloud.hystrix.demo.dto.RspDTO;
import org.ghost.spring.cloud.hystrix.demo.service.IHelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author Administrator
 * @date 2020-09-02 16:31
 */
@Service
public class HelloServiceImpl implements IHelloService {
    @Autowired
    private IHelloDAO helloDAO;

    @HystrixCommand(fallbackMethod = "getFallback",
            commandProperties = {
                    // 熔断器在整个统计时间内是否开启的阀值
                    @HystrixProperty(name = "circuitBreaker.enabled", value = "true"),
                    // 至少有3个请求才进行熔断错误比率计算
                    /**
                     * 设置在一个滚动窗口中，打开断路器的最少请求数。
                     比如：如果值是20，在一个窗口内（比如10秒），收到19个请求，即使这19个请求都失败了，断路器也不会打开。
                     */
                    @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "3"),
                    //当出错率超过50%后熔断器启动
                    @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50"),
                    // 熔断器工作时间，超过这个时间，先放一个请求进去，成功的话就关闭熔断，失败就再等一段时间
                    @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "5000"),
                    // 统计滚动的时间窗口
                    @HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds", value = "10000")
            })
    @Override
    public RspDTO get(String id) {
        return this.helloDAO.get(id);
    }

    private RspDTO getFallback(String id) {
        return new RspDTO("fallback->" + id);
    }
}
